package main

import "fmt"

// go语言提供了一种数据类型  接口， 把所有的具有共性的方法定义在一起，
// 任何其他类型只要实现了这些方法就是实现了这个接口

// 定义一个接口Phone
type Phone interface {
	call()  // 接口里有一个call() 方法
}

// 定义结构体
type NokiaPhone struct {

}

// 实现接口方法
func (nokiaPhone NokiaPhone) call() {
	fmt.Println("I am Nokia, I can call you!")
}

type IPhone struct{

}

func (iPhone IPhone) call() {
	fmt.Println("I am iPhone, I can call you")
}



// 隐式接口
// 类型通过那些方法来实现接口。 没有显式声明的必要;所以也就没有关键字implements

// 隐式接口解藕了实现接口的包和定义接口的包： 互不依赖




func main() {
	// 定义了一个Phone类型的变量  分别赋值为NokiaPhone IPhone
	var phone Phone
	phone = new(NokiaPhone)
	phone.call()

	phone = new(IPhone)
	phone.call()
}